package br.boicotando.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import br.boicotando.persistencia.EProduto;
import br.boicotando.persistencia.ESetor;

public class ProdutoDaoDB extends DaoDB<EProduto> implements ProdutoDao {

	public ProdutoDaoDB(Session sess) {
		super(sess);
	}

	@Override
	public EProduto consultarId(String id) {
		Query qry = sess.createQuery("select o from EProduto o where o.id = :id");
		qry.setParameter("id", id);
		List<?> Produtos = qry.list();
		if (!Produtos.isEmpty()) {
			return (EProduto) Produtos.get(0);
		}
		return null;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<EProduto> consultarTodos() {
		Query qry = sess.createQuery("select o from EProduto o");
		List<?> Produtos = qry.list();
		return (List<EProduto>) Produtos;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<EProduto> consultarSetores(List<ESetor> setores) {
		Query qry;
		StringBuffer sb = new StringBuffer("select p from EProduto p where p.setor in ");
		char sep = '(';
		for (int i = 0; i < setores.size(); ++i) {
			sb.append(sep);
			sb.append(":setor");
			sb.append(i);
			sep = ','; 
		}
		sb.append(')');
		qry = sess.createQuery(sb.toString());
		for (int i = 0; i < setores.size(); ++i) {
			qry.setParameter("setor" + i, setores.get(i));
		}
		List<?> Produtos = qry.list();
		return (List<EProduto>) Produtos;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<EProduto> consultarSetores(List<ESetor> setores, String descricao) {
		Query qry;
		StringBuffer sb = new StringBuffer("select p from EProduto p where p.setor in ");
		char sep = '(';
		for (int i = 0; i < setores.size(); ++i) {
			sb.append(sep);
			sb.append(":setor");
			sb.append(i);
			sep = ','; 
		}
		sb.append(") and lower(p.descricao) like '%");
		sb.append(descricao.toLowerCase());
        sb.append("%'");
		qry = sess.createQuery(sb.toString());
		for (int i = 0; i < setores.size(); ++i) {
			qry.setParameter("setor" + i, setores.get(i));
		}
		List<?> Produtos = qry.list();
		return (List<EProduto>) Produtos;
	}

}
